package cn.tedu.springbootdemo;

import cn.tedu.springbootdemo.dao.UserDao;
import cn.tedu.springbootdemo.entity.User;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

/**
 * 单元测试：脱离Spring环境，只是对软件的组件进行的测试称为单元测试，比如说对业务层进行测试
 *         单元测试的时候，可以手动的创建数据层测试组件，可以通过模拟框架来实现
 * 集成测试：依赖于Spring上下文环境，对软件的多个层次进行测试
 */
public class JUnit5Test02 {
    /**
     * Mockito 模拟框架
     * 主要功能：创建和管理模拟对象，以便进行自动化单元测试
     * 目的：简化JAVA开发人员的测试代码编写和维护
     *
     * 使用步骤：
     * 1.基于接口创建模拟对象，用于替换实际实现的对象，底层是JDK动态代理
     * 2.通过模拟训练、模拟接口的行为
     *
     * 模拟UserDao的查询效果
     */

    UserDao userDao;


    User user;

    @BeforeEach
    void init(){
        userDao=Mockito.mock(UserDao.class);
        System.out.println(userDao);
        //测试模拟对象的功能
        user = userDao.findUserByName("tom");
        System.out.println(user);

        //训练模拟对象
        Mockito.when(userDao.findUserByName("Tom"))
            .thenReturn(new User(1,"Tom","123","ADMIN"));
    }

    @Test
    void test(){
        //测试训练结果
        user = userDao.findUserByName("Tom");
        System.out.println(user);
    }


}
